package com.atguigu.com.nio.nio_1_buffer;

/**
 * @Author: robert.song
 * @Date: Created in 2021/8/7
 */

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 说明
 * 1、MappedByteBuffer 可让文件直接在内存（堆外内存）修改，操作系统不需要拷贝一次
 */
public class MappedByteBufferTest {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\file\\project\\cx\\test.log");
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        file.createNewFile();
        RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\file\\project\\cx\\test.log", "rw");
//        获取对应的通道
        FileChannel channel = randomAccessFile.getChannel();
        /**
         * 参数1：FileChannel.MapMode.READ_WRITE 使用的读写模式
         * 参数2：0：可直接修改的起始位置
         * 参数3：5：映射到内存的大小
         * 可用直接修改的范围就是0-5
         */
        MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
        mappedByteBuffer.put(0, (byte) 'H');
        mappedByteBuffer.put(3, (byte) '9');
        mappedByteBuffer.put(4, (byte) '9');
//      java.lang.IndexOutOfBoundsException,因为5指的是size，而非索引，到4已经满足size最大值，因此在index为5时报错
        mappedByteBuffer.put(5, (byte) '9');
        randomAccessFile.close();

    }
}
